<!DOCTYPE html>
<html lang="zh-CH" >
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="" />
	
	
	
	<title>Unity官方文档翻译之 AssetBundle 的常见问题 ｜ zansimple</title>
	
    
    
    <meta name="description" content="正文 本节描述在使用 assetbundle 的项目中经常出现的几个问题。
资源重复（Asset Duplication） Unity 5的 AssetBundle 系统将在 object 被构建成 AssetBundle 时查找 object 的所有依赖项。这是基于资源数据库完成的。这种依赖信息用于确定将被包含在 AssetBundle 中的 Objects 。 被指定分配给 AssetBundle 的 Object 只会被构建到该 AssetBundle 中（ Object 的 assetBundleName 不为空）。 任何在 AssetBundle 中没有指定分配的 Object 都将包含在所有引用了该 Object 的 AssetBundle 中，无论 AssetBundle 中有一个还是多个 Objects 引用了它。 如果两个不同的对象被分配给两个不同的 assetbundle ，但是它们都有一个共同依赖对象的引用，那么这个依赖对象将被复制到两个 assetbundle中。重复的依赖也会被实例化，这意味着依赖对象的两个副本将被视为具有不同标识符的不同对象。这将增加应用程序的 assetbundle 的大小。如果应用加载了这两个 AssetBundles ，那么就会导致内存中加载了两份Object。 有几种方法可以解决这个问题：
 确定打包进不同的 assetbundle 中的 Object 没有相同的依赖。任何共享依赖项的对象都可以被放置到同一个 AssetBundle 中，避免重复依赖。   这种方法对于具有很多共享依赖的项目来说是不可行的。并且造成使整个 assetbundle 频繁的重新构建和下载。不方便，不高效。  分割 AssetBundles，使得拥有共同依赖的 AssetBundles 不会同时被加载。   这种方法可能适用于某些类型的项目，比如以关卡为基础的游戏。然而，它仍然不必要地增加了项目的 assetbundle 的大小，并且增加了构建时间和加载时间  确保所有依赖项资产都被构建到自己的 assetbundle 中。这完全消除了重复资产的风险，但也带来了复杂性。应用程序必须跟踪 AssetBundle 之间的依赖关系，并确保在调用任何 AssetBundle 之前加载得当的 AssetBundle 。  在 Unity 5 中，对象依赖关系通过位于 UnityEditor 名称空间中的 AssetDatabase API 来跟踪。正如名称空间那样，这个 API 只在 Unity 编辑器中可用，而不是在运行时。AssetDatabase." />
    

    

	
    
    <link rel="shortcut icon" href="https://lenzan.github.io/images/favicon.ico" />

    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/normalize.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/zozo.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="https://cdn.jsdelivr.net/npm/remixicon@2.5.0/fonts/remixicon.css" />
    <link rel="stylesheet" type="text/css" media="screen" href="https://lenzan.github.io/css/highlight.css" />

    
    
</head>

<body>
    <div class="main animate__animated animate__fadeInDown">
        <div class="nav_container animated fadeInDown">
    <div class="site_nav" id="site_nav">
        <ul>
            
            <li>
                <a href="/">首页</a>
            </li>
            
            <li>
                <a href="/">unity</a>
            </li>
            
            <li>
                <a href="/">归档</a>
            </li>
            
            <li>
                <a href="/">关于</a>
            </li>
            
        </ul>
    </div>
    <div class="menu_icon">
        <a id="menu_icon"><i class="ri-menu-line"></i></a>
    </div>
</div>
        <div class="header animated fadeInDown">
    <div class="site_title_container">
        <div class="site_title">
            <h1>
                <a href="https://lenzan.github.io/">
                    <span>zansimple</span>
                    <img src="https://lenzan.github.io/images/logo.svg" />
                </a>
            </h1>
        </div>
        <div class="description">
            <p class="sub_title">专注于Unity虚拟现实开发，游戏开发</p>
            <div class="my_socials">
                
                <a href="https://lenzan.github.io/index.xml" type="application/rss+xml" title="rss" target="_blank"><i
                        class="ri-rss-fill"></i></a>
            </div>
        </div>
    </div>
</div>
        <div class="content">
            <div class="post_page">
                <div class="post animate__animated animate__fadeInDown">
                    <div class="post_title post_detail_title">
                        <h2><a href='/posts/assetbundle/Troubleshooting/'>Unity官方文档翻译之 AssetBundle 的常见问题</a></h2>
                        <span class="date">2018.06.03</span>
                    </div>
                    <div class="post_content markdown"><h2 id="正文">正文</h2>
<p>本节描述在使用 assetbundle 的项目中经常出现的几个问题。</p>
<h2 id="资源重复asset-duplication">资源重复（Asset Duplication）</h2>
<p>Unity 5的 AssetBundle 系统将在 object 被构建成 AssetBundle 时查找 object 的所有依赖项。这是基于资源数据库完成的。这种依赖信息用于确定将被包含在 AssetBundle 中的 Objects 。
被指定分配给 AssetBundle 的 Object 只会被构建到该 AssetBundle 中（ Object 的 assetBundleName 不为空）。
任何在 AssetBundle 中没有指定分配的 Object 都将包含在所有引用了该 Object 的 AssetBundle 中，无论 AssetBundle 中有一个还是多个 Objects 引用了它。
如果两个不同的对象被分配给两个不同的 assetbundle ，但是它们都有一个共同依赖对象的引用，那么这个依赖对象将被复制到两个 assetbundle中。重复的依赖也会被实例化，这意味着依赖对象的两个副本将被视为具有不同标识符的不同对象。这将增加应用程序的 assetbundle 的大小。如果应用加载了这两个 AssetBundles ，那么就会导致内存中加载了两份Object。
有几种方法可以解决这个问题：</p>
<ol>
<li>确定打包进不同的 assetbundle 中的 Object 没有相同的依赖。任何共享依赖项的对象都可以被放置到同一个 AssetBundle 中，避免重复依赖。</li>
</ol>
<ul>
<li>这种方法对于具有很多共享依赖的项目来说是不可行的。并且造成使整个 assetbundle 频繁的重新构建和下载。不方便，不高效。</li>
</ul>
<ol start="2">
<li>分割 AssetBundles，使得拥有共同依赖的 AssetBundles 不会同时被加载。</li>
</ol>
<ul>
<li>这种方法可能适用于某些类型的项目，比如以关卡为基础的游戏。然而，它仍然不必要地增加了项目的 assetbundle 的大小，并且增加了构建时间和加载时间</li>
</ul>
<ol start="3">
<li>确保所有依赖项资产都被构建到自己的 assetbundle 中。这完全消除了重复资产的风险，但也带来了复杂性。应用程序必须跟踪 AssetBundle 之间的依赖关系，并确保在调用任何 AssetBundle 之前加载得当的 AssetBundle 。</li>
</ol>
<p>在 Unity 5 中，对象依赖关系通过位于 UnityEditor 名称空间中的 AssetDatabase API 来跟踪。正如名称空间那样，这个 API 只在 Unity 编辑器中可用，而不是在运行时。AssetDatabase.GetDependencies 可以用来定位特定对象或资产的所有直接依赖项。注意这些依赖项可能有它们自己的依赖关系。此外，还可以使用 AssetImporter API 来查询分配给任何特定对象的 AssetBundle 。
通过组合 AssetDatabase 和 AssetImporter apis ，可以编写一个编辑器脚本，以确保 AssetBundle 的所有直接或间接依赖被分配给各自的AssetBundle ，或者任意两个有共享依赖的 AssetBundles ,被打包进一个 assetbundle ，由于复制资源的内存成本，建议所有项目都有这样的脚本。</p>
<h2 id="sprite-图集重复sprite-atlas-duplication">Sprite 图集重复（Sprite Atlas Duplication）</h2>
<p>当 Unity5 中资源依赖的计算代码，和自动生成 Sprite Atlas 结合使用的时候，会出一点奇怪的问题，
任何自动生成的 sprite 图集都会和图集生成的 Sprite Objects 一起打包到 AssetBundle 中。如果 Sprite Objects 被分配给多个 AssetBundles，那么 Sprite Atlas 就不会被打包为一个 AssetBundle ，并且出现资源重复。如果精 sprite object 没有被分配给一个AssetBundle ，那么 Sprite atlas 也不会被分配给一个 AssetBundle。
为了确保 Sprite Atlas 没有被复制.需要检查划分到同一个 Sprite Atlas 的 sprites (Tag 相同)要被指明为相同的 AssetBundle。</p>
<h2 id="安卓纹理问题android-textures">安卓纹理问题（Android Textures）</h2>
<p>由于 Android 生态系统中设备的严重碎片化，通常需要将纹理压缩成几种不同的格式。虽然所有的 Android 设备都支持 ETC1，但是 ETC1 不支持带有 alpha 通道的纹理。如果一个应用程序不需要 OpenGL ES 2 支持，解决这个问题的最干净的方法是使用 ETC2 ，它由所有 Android OpenGL ES 3 设备支持。
大多数应用程序需要在没有 ETC2 支持的旧设备上运行。解决这个问题的一种方法是使用 Unity 5 的 AssetBundle 版本变量。（请参阅 Unity 的 Android 优化指南，了解其他选项的详细信息。）
要使用 AssetBundle 版本变量，所有不能用 ETC1 格式压缩的纹理必须被到只包含纹理的 assetbundle 中。接下来，接着，为不支持 ETC2 格式的安卓生态系统创建合适的版本变量，使用特定的纹理压缩格式，比如：DXT5、PVRTC、ATITC。针对每一个版本变量，改变纹理的 TextureImporter 设置，使其与版本变量一致。
在运行时，使用 SystemInfo.SupportsTextureFormat() 方法可以检测支持的纹理压缩格式。你可以使用这个信息，根据所支持的格式纹理，选择和加载相应的 AssetBundle 版本变量。</p>
<h2 id="ios文件句柄溢出ios-file-handle-overuse">IOS文件句柄溢出（iOS File Handle Overuse）</h2>
<p>当前版本已经解决这个问题 具体不在描述</p>
</div>
                    <div class="post_footer">
                        
                        <div class="meta">
                            <div class="info">
                                <span class="field tags">
                                    <i class="ri-stack-line"></i>
                                    
                                    <a href="https://lenzan.github.io/tags/Unity3D/">Unity3D</a>
                                    
                                    <a href="https://lenzan.github.io/tags/AssetBundle/">AssetBundle</a>
                                    
                                </span>
                            </div>
                        </div>
                        
                    </div>
                </div>
                
                
            </div>
        </div>
    </div>
    <a id="back_to_top" href="#" class="back_to_top"><span>△</span></a>
    <footer class="footer">
    <div class="powered_by">
        <a href="https://varkai.com">Designed by VarKai,</a>
        <a href="http://www.gohugo.io/">Proudly published with Hugo</a>
    </div>

    <div class="footer_slogan">
        <span></span>
    </div>
</footer>
    <script src="https://lenzan.github.io/js/jquery-3.5.1.min.js"></script>
<link href="https://lenzan.github.io/css/fancybox.min.css" rel="stylesheet">
<script src="https://lenzan.github.io/js/fancybox.min.js"></script>
<script src="https://lenzan.github.io/js/zozo.js"></script>






</body>

</html>